import request from '@/config/axios'

// 报告 VO - 包含完整数据字段
export interface PresentationVO {
  id: number; // 数据Id
  name: string; // 报告名称
  remark: string; // 备注
  createTime: Date,
  startTime: Date; // 开始时间 (YYYY-MM-DD HH:mm:ss)
  endTime: Date; // 结束时间 (YYYY-MM-DD HH:mm:ss)
}

// 表单专用类型（所有字段都为可选，支持undefined初始值）
export type PresentationForm = Partial<PresentationVO>;

// 更新报告 DTO - 继承VO并允许部分字段更新
export type UpdatePresentationDTO = Partial<PresentationVO>;

// 报告 API
export const PresentationApi = {
  // 查询报告分页
  getPresentationPage: async (params: any) => {
    return await request.get({ url: `/member/presentation/page`, params });
  },

  // 查询报告详情
  getPresentation: async (id: number) => {
    return await request.get({ url: `/member/presentation/get?id=${id}` });
  },

  // 新增报告
  createPresentation: async (data: PresentationVO) => {
    return await request.post({ url: `/member/presentation/create`, data });
  },

  // 修改报告
  updatePresentation: async (data: PresentationVO) => {
    return await request.put({ url: `/member/presentation/update`, data });
  },

  // 删除报告
  deletePresentation: async (id: number) => {
    return await request.delete({ url: `/member/presentation/delete?id=${id}` });
  },

  // 导出报告 Excel
  exportPresentation: async (params: any) => {
    return await request.download({ url: `/member/presentation/export-excel`, params });
  },

  // 下载报告文件
  downloadPresentation: async (id: number, fileName: string) => {
    try {
      // 1. 发起请求时明确要求不转换响应体（避免拦截器干扰）
      const response = await request.download({
        url: `/member/transportation-record/export-word/${id}`,
        params: { fileName: fileName },
        // 关键：如果request封装有默认转换，强制禁用
        transformResponse: [data => data]
      });

      // 2. 验证响应的完整性
      if (!response) {
        throw new Error('下载失败：服务器无响应');
      }

      // 3. 验证数据类型（必须是Blob或ArrayBuffer）
      if (!(response instanceof Blob) && !(response instanceof ArrayBuffer)) {
        // 尝试将错误数据转换为文本，排查后端问题
        const errorText = typeof response === 'string'
          ? response
          : await new Response(response.data).text();
        console.error('后端返回非二进制数据：', errorText);
        throw new Error('下载失败：服务器返回格式错误');
      }

      // 4. 处理Blob数据
      const blob = response instanceof Blob
        ? response
        : new Blob([response], {
          type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        });

      // 5. 验证Blob大小（排除空文件）
      if (blob.size <= 0) {
        throw new Error('下载失败：生成的文件为空');
      }

      // 6. 触发下载
      const url = window.URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = fileName || `交通记录_${new Date().getTime()}.docx`; // 确保文件名有效
      document.body.appendChild(a);
      a.click();

      // 7. 延迟清理资源（确保文件已开始下载）
      setTimeout(() => {
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
      }, 500);

      return true;
    } catch (error) {
      console.error('下载失败详情：', error);
      // 可添加UI错误提示（如弹窗）
      throw error;
    }
  },

  // 上传HTML并生成Word文件
  mergeBinaryData: async (id: number, formData: FormData) => {
    return await request.post({
      url: `/member/presentation/merge-binary/${id}`,
      data: formData,
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    });
  }
};
